package reflect;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;

/**
 * 实例化与当前类Test2在同一个包中的所有类
 * 思路:
 * 1:首先定位Test2的字节码文件所在的目录(main方法里第一行代码)
 * 2:通过该目录获取里面所有的.class文件
 * 3:由于字节码文件名与类名一致(JAVA语法要求)，因此可以通过文件名确定类名
 * 4:使用Class.forName()加载对应的类并实例化
 */

public class Test2 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        File dir = new File(
                Test2.class.getResource(".").toURI()
        );
        System.out.println(dir);
        File[] subs = dir.listFiles((f) -> f.getName().endsWith(".class"));
        for (int i = 0; i < subs.length; i++) {
           /* File sub = subs[i];
            String str = subs[i].getName();
            Class cls = Class.forName(dir.str);
            Object obj = cls.newInstance();
            System.out.println(obj);*/
            File sub = subs[i];
            String fileName = sub.getName();
            String className = fileName.substring(0,fileName.lastIndexOf("."));
            System.out.println("文件名：");
            System.out.println(className);
            String packName = Test2.class.getPackage().getName();
            System.out.println("包名：");
            System.out.println(packName);
            Class cls = Class.forName(packName + "." + className);
            Object obj = cls.newInstance();
            System.out.println(obj);

            Method[] methods = cls.getDeclaredMethods();
            for(Method method : methods){
                if(method.getParameterCount() == 0 &&
                method.getModifiers() == Modifier.PUBLIC
                ){
                    System.out.println("调用方法:" + method.getName()+"()");
                    method.invoke(obj);
                }
            }


        }
    }
}
